#include "bmp.h"
BMP::BMP(const char *bmp_path)
{
    this->fd  = open(bmp_path, O_RDONLY);
    if (this->fd == -1)
    {
        perror("open bmp file failed");
        exit(1);
    }
    //获取图片的宽度和高度
    lseek(this->fd, 18, SEEK_SET);
    read(this->fd, &this->m_width, 4);
    read(this->fd, &this->m_height, 4);
    //获取图片的大小
    this->m_size = this->m_width * this->m_height * 3;
    //申请图片大小的内存
    this->m_buf = new char[this->m_size];
    //计算一行要补齐的字节数
    int skip_byte = 0;
    if(this->m_width*3 % 4 != 0)
    {
        skip_byte = 4 - this->m_width*3 % 4;
    }
    //读取图片数据
    lseek(this->fd, 54, SEEK_SET);
    //倒置存放图片的数据放到内存中
    char *tmp_ptr = this->m_buf;
    tmp_ptr += this->m_size;
    for(int i = 0; i < this->m_height; i++)
    {
        tmp_ptr -= this->m_width*3;
        read(this->fd, tmp_ptr, this->m_width*3);
        lseek(this->fd, skip_byte, SEEK_CUR);
    }
    ::close(this->fd);//加上冒号的原因是防止与本类函数名冲突
}
BMP::~BMP()
{
    delete [] this->m_buf;
}
char BMP::operator[](int index)
{
    return this->m_buf[index];//返回指定索引的像素值
}
char *BMP::addr()const
{
    return this->m_buf;
}
int BMP::show(int *mp, int x, int y)
{
    for(int i=0,n=0; i<this->m_height; i++)  // 遍历图片的每一行（垂直方向）
    {
        for(int j=0; j<this->m_width; j++,n+=3)  // 遍历一行中的每一个像素（水平方向）
        {
            // 计算当前像素在目标内存（显存）中的位置，并写入转换后的像素值
            *(mp + 800*(i+y) + j+x) = 
                this->m_buf[n]<<0        // B分量（最低8位）
                | this->m_buf[n+1]<<8    // G分量（中间8位）
                | this->m_buf[n+2]<<16;  // R分量（高8位）
        }
    }
    return 0;
}
int BMP::width() const
{
    return m_width;
}

int BMP::height() const
{
    return m_height;
}